package org.glut.saltedfish.servlet;

import com.google.gson.Gson;
import jakarta.servlet.ServletException;
import jakarta.servlet.annotation.WebServlet;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.glut.saltedfish.domain.User;
import org.glut.saltedfish.service.UserServiceImpl;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 注册用户的 Servlet 控制器，处理客户端发送的注册请求。
 * 映射路径为 /saltedFish/sign，支持 POST 和 GET 请求。
 * 接收前端 JSON 数据（包含用户注册信息），反序列化为 User 实体，
 * 然后通过 UserService 完成注册操作并返回 JSON 响应。
 * JSON 请求示例：
 * {
 *   "username": "Alice",
 *   "password": "123456",
 *   "phone": "13800138000",
 *   "email": "alice@example.com"
 * }
 * JSON 响应示例：
 * 注册成功: {"code":200, "msg":"注册成功"}
 * 注册失败: {"code":409, "msg":"手机号或邮箱已注册"}
 * 异常时返回 HTTP 500 状态码。
 *HDFuiny
 *2025/7/17 16:10 2025 07
 */
@WebServlet("/sign")
public class SignServlet extends HttpServlet {

    private static final Logger logger = Logger.getLogger(SignServlet.class);
    private UserServiceImpl userServiceImpl;

    /**
     * Servlet 初始化，创建 UserService。
     * @throws ServletException 如果 UserService 初始化失败时抛出
     */
    @Override
    public void init() throws ServletException {
        userServiceImpl = new UserServiceImpl();  // 通过 MybatisUtil 获取 session
        logger.debug("UserService 初始化完成");
    }

    /**
     * 重写 GET 请求方法，将其代理到 doPost，支持部分客户端以 GET 请求方式提交注册数据。
     */
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        doPost(req, resp);
    }

    /**
     * 处理 POST 请求，接收用户注册数据，解析为 User 对象，
     * 并通过 UserService 完成注册逻辑。
     */
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
        resp.setContentType("application/json;charset=utf-8");

        try (BufferedReader br = req.getReader();
             PrintWriter out = resp.getWriter())
        {
            StringBuilder builder = new StringBuilder();
            String line;
            while ((line = br.readLine()) != null) {
                builder.append(line);
            }

            String json = builder.toString();

            Gson gson = new Gson();
            User user = gson.fromJson(json, User.class);

            boolean success = userServiceImpl.registerUser(user);

            if (success) {
                out.write("{\"code\":200, \"msg\":\"注册成功\"}");
            } else {
                out.write("{\"code\":409, \"msg\":\"用户名或手机号或邮箱已注册\"}");
            }

        } catch (Exception e) {
            logger.error("注册过程中发生异常", e);
            resp.setStatus(500);
        }
    }
}
